package group.sicher.core.data.transaction;

/**
 * description:
 * spring 事物管理器配置
 * author:dengjinde
 * date:2019/3/18
 */
//@Aspect//配置全局事物用的切面注解
//@Configuration
//@EnableTransactionManagement //开启注解事物管理，等同于xml配置文件中的 <tx:annotation-driven />
// 实际上spring-boot2.0以上默认是开启事物管理的 所以可以不用配置这个
public class SicherTransactionConfigure {

//    //事物拦截处理扫描的包路径
//    private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.aron.framework.hibernate.*.*(..)) or execution(* *..dao*..*(..))";
//    //事物响应的超时时间 单位秒
//    private static final int TX_METHOD_TIMEOUT = 120;
//
//
//    @Resource(name = "transactionManager")
//    private PlatformTransactionManager transactionManager;
//
//    /**
//     * 配置HibernateTransactionManager 事物
//     *
//     * @param entityManagerFactory
//     * @return
//     */
//    @Bean(name = "transactionManager")
//    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
//        return new HibernateTransactionManager(entityManagerFactory.unwrap(SessionFactory.class));
//    }
//
//    /**
//     * 自定义实现 spring的一个包含数据源的事务管理器
//     *
//     * @return
//     */
//    @Override
//    public PlatformTransactionManager annotationDrivenTransactionManager() {
//        return transactionManager;
//    }
//
//    /**
//     * 全局事务配置
//     * <p>
//     * 写的方法配置 PROPAGATION_NOT_SUPPORTED 事物级别 隔离级别为DEFAULT
//     * 读的方法配置只读事物
//     * PROPAGATION_NOT_SUPPORTED 如果当前有事物 则使用当前事物 否则新建一个事物
//     *
//     * @return
//     */
//    @Bean
//    public TransactionInterceptor txAdvice() {
//        NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
//        /*只读事务，不做更新操作*/
//        RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
//        readOnlyTx.setReadOnly(true);
//        readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
//        /*当前存在事务就使用当前事务，当前不存在事务就创建一个新的事务*/
//        RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute();
//        requiredTx.setRollbackRules(
//                Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
//        requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//        requiredTx.setTimeout(TX_METHOD_TIMEOUT);
//        Map<String, TransactionAttribute> txMap = new HashMap<>();
//        txMap.put("create*", requiredTx);
//        txMap.put("add*", requiredTx);
//        txMap.put("save*", requiredTx);
//        txMap.put("update*", requiredTx);
//        txMap.put("execute*", requiredTx);
//        txMap.put("call*", requiredTx);
//        txMap.put("delete*", requiredTx);
//        txMap.put("batch*", requiredTx);
//        txMap.put("get*", readOnlyTx);
//        txMap.put("list*", readOnlyTx);
//        txMap.put("find*", readOnlyTx);
//        txMap.put("select*", readOnlyTx);
//        txMap.put("query*", readOnlyTx);
//        source.setNameMap(txMap);
//        TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source);
//        return txAdvice;
//    }
//
//    /**
//     * AOP通知顾问 配置事物执行的连接点
//     * @return
//     */
//    @Bean
//    public Advisor txAdviceAdvisor() {
//        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
//        pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
//        return new DefaultPointcutAdvisor(pointcut, txAdvice());
//    }

}
